﻿using System;
using System.Net.Sockets;
using System.Threading;

namespace Klijent
{
    class Naredba
    {
        public string lijeviMotor { get; set; }
        public string desniMotor { get; set; }
        public string ugasi { get; set; }
        public Komunikacija kom { get; set; }

        public Naredba()
        {
            Komunikacija kom = new Komunikacija("Elektronika");
            kom.posaljiVarijable("lijeviMotor:0;");
            kom.posaljiVarijable("desniMotor:0;");
            kom.posaljiVarijable("ugasi:0;");
        }
        public void naredbaLijeviMotor()
        {
            lijeviMotor = kom.zatraziVarijable("lijeviMotor;");
            lijeviMotor = lijeviMotor.Substring(lijeviMotor.IndexOf(':') + 1);
            lijeviMotor = lijeviMotor.Substring(0, lijeviMotor.IndexOf(';'));
        }
        public void naredbaDesniMotor()
        {
            desniMotor = kom.zatraziVarijable("desniMotor;");
            desniMotor = desniMotor.Substring(desniMotor.IndexOf(':') + 1);
            desniMotor = desniMotor.Substring(0, desniMotor.IndexOf(';'));
        }
        public void naredbaUgasi()
        {
            ugasi = kom.zatraziVarijable("ugasi;");
            ugasi = ugasi.Substring(ugasi.IndexOf(':') + 1);
            ugasi = ugasi.Substring(0, ugasi.IndexOf(';'));
        }
        public void kraj()
        {
            kom.zavrsiSaKomunikacijom();
        }
    }
    class Ulaz
    {
        static void Main(string[] args)
        {
            Device a = new Device(Console.Out, Console.Out);
            Naredba naredba = new Naredba();
            a.OpenDevice();
            while (true)
            {
                naredba.naredbaDesniMotor();
                naredba.naredbaLijeviMotor();
                naredba.naredbaUgasi();

                if (naredba.ugasi[0] == 'q')
                {
                    break;
                }

                if (naredba.lijeviMotor[0] != '0')
                {
                    String tempString = naredba.lijeviMotor.Substring(0, naredba.lijeviMotor.Length);
                    String realString = a.AttachCRC(tempString);
                    a.WriteCommand(realString);
                    System.Console.WriteLine(realString);
                }

                if (naredba.desniMotor[0] != '0')
                {
                    String tempString1 = naredba.desniMotor.Substring(0, naredba.desniMotor.Length);
                    String realString1 = a.AttachCRC(tempString1);
                    a.WriteCommand(realString1);
                    System.Console.WriteLine(realString1);
                }
                Thread.Sleep(1000);
            }
            a.CloseDevice();
            naredba.kraj();
        }

    }
    class Komunikacija
    {
        public string imeModula { get; set; }
        public NetworkStream n { get; set; }
        public TcpClient client { get; set; }

        public Komunikacija(string ImeModula)
        {
            TcpClient clientSocket = new TcpClient();
            client = clientSocket;
            Console.WriteLine("Klijent pokrenut");
            try
            {
                client.Connect("127.0.0.1", 5001);
                n = client.GetStream();
            }
            catch
            {
                Console.WriteLine("Server nije pokrenut");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("klijent spojen");


            imeModula = ImeModula;
        }

        public string zatraziVarijable(string varijable)
        {
            string podaci;
            byte[] outStream = new byte[10025];
            byte[] inStream = new byte[10025];
            podaci = imeModula + ";GET;" + varijable + "$";
            outStream = System.Text.Encoding.ASCII.GetBytes(podaci);
            try
            {
                n.Write(outStream, 0, outStream.Length);
                n.Flush();
            }
            catch
            {
                Console.WriteLine("Nije uspjelo slanje");
            }
            try
            {
                n.Read(inStream, 0, 10025);
            }
            catch
            {
                Console.WriteLine("Nije uspjelo čitanje");
            }
            string odgovor = System.Text.Encoding.ASCII.GetString(inStream);
            odgovor = odgovor.Substring(0, odgovor.IndexOf("$"));
            return odgovor;
        }

        public string posaljiVarijable(string varijable)
        {
            string podaci;
            byte[] outStream = new byte[10025];
            byte[] inStream = new byte[10025];
            podaci = imeModula + ";SET;" + varijable + "$";
            outStream = System.Text.Encoding.ASCII.GetBytes(podaci);
            try
            {
                n.Write(outStream, 0, outStream.Length);
                n.Flush();
            }
            catch
            {
                Console.WriteLine("Nije uspjelo slanje");
            }
            try
            {
                n.Read(inStream, 0, 10025);
            }
            catch
            {
                Console.WriteLine("Nije uspjelo čitanje");
            }
            string odgovor = System.Text.Encoding.ASCII.GetString(inStream);
            odgovor = odgovor.Substring(0, odgovor.IndexOf("$"));
            return odgovor;
        }

        public string zavrsiSaKomunikacijom()
        {
            string podaci;
            byte[] outStream = new byte[10025];
            byte[] inStream = new byte[10025];
            podaci = imeModula + ";LOGOUT;$";
            outStream = System.Text.Encoding.ASCII.GetBytes(podaci);
            try
            {
                n.Write(outStream, 0, outStream.Length);
                n.Flush();
            }
            catch
            {
                Console.WriteLine("Nije uspjelo slanje");
            }
            try
            {
                n.Read(inStream, 0, 10025);
            }
            catch
            {
                Console.WriteLine("Nije uspjelo čitanje");
            }
            string odgovor = System.Text.Encoding.ASCII.GetString(inStream);
            odgovor = odgovor.Substring(0, odgovor.IndexOf("$"));
            if (odgovor == "Kraj")
            {
                client.Close();
            }
            return odgovor;
        }
    }
}